package com.cincc.config;

import com.alibaba.fastjson.JSONObject;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * Created by liuxingmeng on 17/12/13.
 */
public class MethodReturnValueHandlerDelegate implements HandlerMethodReturnValueHandler {

    private final HandlerMethodReturnValueHandler targetHandler;

    public MethodReturnValueHandlerDelegate(HandlerMethodReturnValueHandler targetHandler) {
        this.targetHandler = targetHandler;
    }

    public boolean supportsReturnType(MethodParameter parameter) {
        return this.targetHandler.supportsReturnType(parameter);
    }

    public void handleReturnValue(Object returnValue, MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
          JSONObject result = new JSONObject();
          result.put("returnMessage", "OK");
          result.put("returnCode", 0);
          result.put("data", JSONObject.toJSON(returnValue));
          this.targetHandler.handleReturnValue(result, parameter, mavContainer, webRequest);
//        MethodReturnValueHandlerDelegate.ParameterHelper helper = new MethodReturnValueHandlerDelegate.ParameterHelper(parameter);


//        boolean isErrorResult = returnValue instanceof ErrorResult;
//        ErrorResult var10000;
//        if(isErrorResult) {
//            var10000 = (ErrorResult)returnValue;
//        } else {
//            var10000 = null;
//        }
//
//        boolean renderRestResult = helper.isRestController() || isErrorResult;
//        boolean keepOrigin = helper.isCompatibleOutput();
//        ValueFormatter valueFormatter = new DummyValueFormatter();
//        ResultFormatter formatter = helper.getResultFormatter();
//        if(!keepOrigin) {
//            keepOrigin = helper.hasClassAnnotation(CompatibleOutput.class);
//        }
//
//        if(formatter != null) {
//            valueFormatter = helper.createValueFormater(formatter.formatterClass());
//        }
//
//        if(keepOrigin) {
//            Object result = returnValue != null?JSONObject.toJSON(returnValue):new JSONObject();
//            this.targetHandler.handleReturnValue(result, parameter, mavContainer, webRequest);
//        } else {
//            if(renderRestResult) {
//                JSONObject jsonResult = new JSONObject();
//                Object data = returnValue;
//                if(returnValue instanceof ResponseEntity) {
//                    data = ((ResponseEntity)returnValue).getBody();
//                }
//
//                if(!isErrorResult && !(data instanceof UserResult)) {
//                    if(data != null) {
//                        if(data instanceof Collection) {
//                            jsonResult.put("data", new JSONObject());
//                        } else {
//                            jsonResult.put("bean", JSONObject.toJSON(data));
//                        }
//                    }
//
//                    jsonResult.put("returnMessage", "OK");
//                    jsonResult.put("returnCode", 0);
//                    returnValue = jsonResult;
//                } else {
//                    returnValue = JSONObject.toJSON(data);
//                }
//            }
//
//            if(!isErrorResult) {
//                this.targetHandler.handleReturnValue(returnValue, parameter, mavContainer, webRequest);
//            }
//
//        }
    }

//    private static class ParameterHelper {
//        MethodParameter parameter;
//
//        public ParameterHelper(MethodParameter parameter) {
//            this.parameter = parameter;
//        }
//
//        Method getMethod() {
//            return this.parameter != null?this.parameter.getMethod():null;
//        }
//
//        Class<?> getDeclaringClass() {
//            return this.parameter != null?this.parameter.getDeclaringClass():null;
//        }
//
//        <T extends Annotation> T getClassAnnotation(Class<T> annotationClass) {
//            return this.parameter != null?this.parameter.getDeclaringClass().getAnnotation(annotationClass):null;
//        }
//
//        <T extends Annotation> boolean hasClassAnnotation(Class<T> annotationClass) {
//            return this.parameter != null && this.getClassAnnotation(annotationClass) != null;
//        }
//
//        <T extends Annotation> boolean hasMethodAnnotation(Class<T> annotationClass) {
//            return this.getMethodAnnotation(annotationClass) != null;
//        }
//
//        <T extends Annotation> T getMethodAnnotation(Class<T> annotationClass) {
//            return this.parameter != null?this.getMethod().getAnnotation(annotationClass):null;
//        }
//
//        public boolean isKeepOrigin() {
//            return this.hasClassAnnotation(CompatibleOutput.class);
//        }
//
//        public boolean isRestController() {
//            return this.hasClassAnnotation(RestController.class);
//        }
//
//        public ResultFormatter getResultFormatter() {
//            return (ResultFormatter)this.getMethodAnnotation(ResultFormatter.class);
//        }
//
//        public boolean isCompatibleOutput() {
//            return this.hasMethodAnnotation(CompatibleOutput.class);
//        }
//
//        public ValueFormatter createValueFormater(Class<? extends ValueFormatter> aClass) throws IllegalAccessException, InstantiationException {
//            return (ValueFormatter)aClass.newInstance();
//        }
//    }
}
